package ar.edu.ufasta.presupuestos.servicios.web;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import ar.edu.ufasta.presupuestos.logica.entidades.Cliente;
import ar.edu.ufasta.presupuestos.logica.entidades.presupuesto.DetallePresupuesto;
import ar.edu.ufasta.presupuestos.logica.entidades.presupuesto.Presupuesto;
import ar.edu.ufasta.presupuestos.servicios.persistencia.ObjectID;
import ar.edu.ufasta.presupuestos.servicios.persistencia.PersistenceFacade;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.InfoPresupuestoRequest;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.InfoPresupuestoResponse;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.RequestPack;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.ResponsePack;

public class InfoPresupuesto extends Protocol {

	private InfoPresupuestoRequest request;
	private InfoPresupuestoResponse response;

	public InfoPresupuesto() {
		super();
		response = new InfoPresupuestoResponse();
	}

	@Override
	public int execute() {
		response.setProtocol(Constantes.PROTOCOL_100);
		response.setSystemCode(Constantes.SYSTEM_CODE);
		response.setResultCode(Constantes.TRANSACTION_OK);
		try {
			// Obtengo info general del presupuesto
			// -> Presupuesto
			Presupuesto miPresupuesto = (Presupuesto) PersistenceFacade
					.getInstance().get(
							new ObjectID(request.getIdPresupuesto()),
							Presupuesto.class);
			if (miPresupuesto != null) {
				response.setIdPresupuesto(miPresupuesto.getIDValue());
				response.setEstadoCode(miPresupuesto.getEstado().getCode());
				response.setEstado(miPresupuesto.getEstado().getNombre());
				response.setMetodoPago(miPresupuesto.getFormaPago()
						.getDescripcion());
				response.setFechaEmision(miPresupuesto.getFechaEmision());
				response.setTotal(miPresupuesto.getTotal());
			} else {
				LogFile.write("---- Transaction Result -> PRESUPUESTO MISSING");
				response.setResultCode(Constantes.ERROR_PRESUPUESTO_MISSING);
				return 0;
			}
			// -> Cliente
			// TODO : Si llamo a miPresupuesto.getCliente trae al objeto Cliente
			// completo?
			Cliente miCliente = (Cliente) PersistenceFacade.getInstance().get(
					new ObjectID(request.getIdCliente()), Cliente.class);
			if (miCliente != null) {
				response.setIdCliente(miCliente.getIDValue());
				response.setNombreCliente(miCliente.getApellido() + ", "
						+ miCliente.getNombre());
				response.setEmailCliente(miCliente.getEmail());
				response.setTelefonoCliente(miCliente.getTelefono());
			} else {
				LogFile.write("---- Transaction Result -> CLIENTE MISSING");
				response.setResultCode(Constantes.ERROR_CLIENTE_MISSING);
				return 0;
			}
			// Obtengo detalle del presupuesto
			List<DetallePresupuesto> detallePresupuesto = miPresupuesto.getDetallePresupuesto();
			List<Hashtable<String, Object>> listaRespuesta = new ArrayList<Hashtable<String,Object>>();
			if (!detallePresupuesto.isEmpty()) {
				Hashtable<String, Object> record;
				Double totalDetalle;
				
				for (Iterator<DetallePresupuesto> iterator = detallePresupuesto.iterator(); iterator.hasNext();) {
					DetallePresupuesto detalleAct = (DetallePresupuesto) iterator.next();
					record = new Hashtable<String, Object>();
					// Armo fila del detalle
					// IDDetalle|Articulo|Costo Unitario|Cantidad|Total_
					record.put("dID", detalleAct.getIDValue());
					record.put("dArticulo", detalleAct.getArticulo().getNombre());
					record.put("dCostoUnitario", detalleAct.getArticulo().getCostoUnitario());
					record.put("dCantidad", detalleAct.getCantidad());
					totalDetalle = detalleAct.getArticulo().getCostoUnitario() * detalleAct.getCantidad();
					record.put("dTotal", totalDetalle);
					listaRespuesta.add(record);
				}
				
			} else {
				LogFile.write("---- Transaction Warning -> DETALLE PRESUPUESTO MISSING");
			}
			LogFile.write("---- Transaction Result -> INFO-PRESUPUESTO OK");
			response.setDetallePresupuesto(listaRespuesta);
		} catch (Exception e) {
			response.setResultCode(Constantes.ERROR_SERVER_ERROR);
			LogFile.write("**** Error in MySQL queries ****");
			return -1;
		}

		return 0;
	}

	/**
	 * @return the request
	 */
	public InfoPresupuestoRequest getRequest() {
		return request;
	}

	/**
	 * @return the response
	 */
	public InfoPresupuestoResponse getResponse() {
		return response;
	}

	/**
	 * @param request
	 *            the request to set
	 */
	public void setRequest(InfoPresupuestoRequest request) {
		this.request = request;
	}

	/**
	 * @param response
	 *            the response to set
	 */
	public void setResponse(InfoPresupuestoResponse response) {
		this.response = response;
	}

	@Override
	public String getOperationMsg() {
		return "---- Received Request   -> INFO-PRESUPUESTO";
	}

	@Override
	public ResponsePack getRespuesta() {
		return (InfoPresupuestoResponse)this.response;
	}

	@Override
	public void setPedido(RequestPack request) {
		this.request = (InfoPresupuestoRequest)request;		
	}

}
